#include "bancoAPI.h"

/********************************************************************
*  Funçao que verifica se o login do cara esta no formato adequado  *
*  exemplo: todas as letras minusculas, o primeiro caracter deve    *
*  ser um alphanumerico, o restante pode ser qualquer coisa,        *
*  ainda deve-se ter um ponto separador no meio.                    *
*  O ideal para username e <nome>.<sobrenome>                       * 
*********************************************************************/
int matchUsername(const char *userName)
{
    regex_t re;
    int status = 0, size;
    char* patternUserName = "^[a-z][a-z0-9]*\\.[a-z0-9]+$";

    size = strlen(userName);
    if ( size > 20 || size <= 0 )
        return 0;

    if(regcomp(&re, patternUserName, REG_EXTENDED|REG_NOSUB) != 0)
        return 0;

    status = regexec(&re, userName, (size_t)0, NULL, 0);

    regfree(&re);

    if(status != 0) 
        return 0;

    return 1;
}

/* Funçao auxiliar para imprimir a estrutura de comando que chegou pelo cliente. */
void printComando(const char* ipOr, Comando* cmd,const char* tipoCmd){
    fprintf(stdout,"___________________________________________________\n");
    fprintf(stdout,"| COMANDO [%s] EXECUTADO PARA [%s]\n",tipoCmd,ipOr);
    fprintf(stdout,"| PROTOCOLO   = %3d   \n",cmd->protocolo);
    fprintf(stdout,"| USUARIO     = %s   \n",cmd->usuario);
    fprintf(stdout,"| SENHA       = %s   \n",cmd->senha);
    fprintf(stdout,"| DATA        = %s   \n",cmd->data);
    fprintf(stdout,"| HORA INICIO = %s   \n",cmd->horaI);
    fprintf(stdout,"| HORA FIM    = %s   \n",cmd->horaF);
    fprintf(stdout,"| MENSAGEM    = %s   \n",cmd->msg);
    fprintf(stdout,"|__________________________________________________\n\n");
}

/* Funçao que trata as requisiçoes de GET */
void handlerReqGet(Comando *cmd, char *msgRetorno){
    int retorno;
    MYSQL_RES *res;
    MYSQL_ROW row;
    char *T_data, *T_horaI;
    char *T_data_B, *T_horaI_B, *T_horaF_B;

    inicializarBanco();

    retorno = fazerLogin(cmd->usuario,cmd->senha);

    if ( retorno == 0 ){
        strcpy(msgRetorno,"400;Usuario/Senha invalidos");
        return;
    }
    else if ( retorno < 0 ){
        strcpy(msgRetorno,"404;Problemas de conexao com o banco.");
        return;
    }

    /* Fazer o Fetch dos dados */
    compoeData( cmd->data , &T_data);
    compoeHora( cmd->horaI, &T_horaI);
    retorno = recuperarEvento(cmd->usuario, T_data ,T_horaI , &res);

    if ( retorno < 0 ){
        strcpy(msgRetorno,"404;Problemas de conexao com o banco.");
        return;
    }

    retorno = 0;

    if((row = mysql_fetch_row(res)) != NULL){
        decompoeData( row[1], &T_data_B);
        decompoeHora( row[2], &T_horaI_B);
        decompoeHora( row[3], &T_horaF_B);
        sprintf(msgRetorno,"200;%s;%s;%s;%s;",T_data_B,T_horaI_B,T_horaF_B,row[4]);
        retorno++;
    }

    if ( retorno == 0 ){
        sprintf(msgRetorno,"400;Caro Sr. <%s>, voce NAO tem evento no dia <%s> comecando as <%s>.", cmd->usuario, cmd->data, cmd->horaI);
    }

    liberarResultSet(res);
    fecharBanco();
}


/* Funçao que trata as requisiçoes de GET ALL*/
void handlerReqGetAll(Comando *cmd, char* msgRetorno, MYSQL_RES** resultSet){
    int retorno;
    char *T_data;

    inicializarBanco();

    retorno = fazerLogin(cmd->usuario,cmd->senha);

    if ( retorno == 0 ){
        strcpy(msgRetorno,"400;Usuario/Senha invalidos");
        return;
    }
    else if ( retorno < 0 ){
        strcpy(msgRetorno,"404;Problemas de conexao com o banco.");
        return;
    }

    /* Fazer o Fetch dos dados */
    compoeData( cmd->data , &T_data);
    retorno = recuperarTodosEventos(cmd->usuario, T_data, resultSet);

    if ( retorno < 0 ){
        strcpy(msgRetorno,"404;Problemas de conexao com o banco.");
        return;
    }

    fecharBanco();
}

void compoeData( char* data, char** retorno )
{
	char dataComposta[12];

	memset( dataComposta, 0, sizeof( dataComposta ) );

	*retorno = malloc( sizeof( dataComposta ) );

	if( sizeof( data ) == 0 ){
		strcpy( *retorno, "NULL" );
		return;
	}

	dataComposta[0] = data[4];
	dataComposta[1] = data[5];
	dataComposta[2] = data[6];
	dataComposta[3] = data[7];
	dataComposta[4] = '-';
	dataComposta[5] = data[2];
	dataComposta[6] = data[3];
	dataComposta[7] = '-';
	dataComposta[8] = data[0];
	dataComposta[9] = data[1];
	
	strcpy( *retorno, dataComposta );
}

char* decompoeData( char* data, char** retorno )
{
	char dataDecomposta[10];

	memset( dataDecomposta, 0, sizeof( dataDecomposta ) );

	*retorno = malloc( sizeof( dataDecomposta ) );

	dataDecomposta[4] = data[0];
	dataDecomposta[5] = data[1];
	dataDecomposta[6] = data[2];
	dataDecomposta[7] = data[3];
	dataDecomposta[2] = data[5];
	dataDecomposta[3] = data[6];
	dataDecomposta[0] = data[8];
	dataDecomposta[1] = data[9];
	
	strcpy( *retorno, dataDecomposta );
}

char* compoeHora( char* hora, char** retorno )
{
	char horaComposta[10];

	memset( horaComposta, 0, sizeof( horaComposta ) );

	*retorno = malloc( sizeof( horaComposta ) );

	horaComposta[0] = hora[0];
	horaComposta[1] = hora[1];
	horaComposta[2] = ':';
	horaComposta[3] = hora[2];
	horaComposta[4] = hora[3];
	horaComposta[5] = ':';
	horaComposta[6] = '0';
	horaComposta[7] = '0';
	
	strcpy( *retorno, horaComposta );
}

char* decompoeHora( char* hora, char** retorno )
{
	char horaDecomposta[6];

	memset( horaDecomposta, 0, sizeof( horaDecomposta ) );

	*retorno = malloc( sizeof( horaDecomposta ) );

	horaDecomposta[0] = hora[0];
	horaDecomposta[1] = hora[1];
	horaDecomposta[2] = hora[3];
	horaDecomposta[3] = hora[4];
	
	strcpy( *retorno, horaDecomposta );
}

// Funçao do Eugenio.
void createFile(char *path, char *mode, char *option){
	FILE *f = fopen(path, "r");
if(f == NULL)
puts("eh nulo");
	if(strcmp(option, _G) == 0 && f == NULL || strcmp(mode, _W) == 0){
puts("eh escrita...");
		f = fopen(path, "w");
		if (f == NULL) {
			puts("Path or directory not found!");
			getc(stdin);
			exit(-1);			
		}
		if(strcmp(mode, _R) == 0){
			f = fopen(path, "r");
			fr = f;
		}
		else
			fw = f;
	}
	else {
puts("esta no else");
		fr = f;
if(f == NULL)
puts("f eh nulo");
if(fr == NULL)
puts("fr eh nulo");
	}
	if ( f == NULL )
	{
		printf("Erro ao abrir %s em modo %s opcao %s",path,mode,option);
		getc(stdin);
		exit(-1);
	}
	if ( fw == NULL && mode==_W )
	{
		printf("Erro ao abrir %s em modo %s opcao %s",path,mode,option);
		getc(stdin);
		exit(-1);
	}
}
